跳到主要内容

动画树

功能概述

在上一节,大家应该已经感受到了动画播放器(AnimationPlayer)功能的强大与灵活,可以做出十分出色的动画效果,它可以在任何节点或资源中对任何属性进行动画处理,以及专门的变换、贝塞尔、函数调用、音频和子动画轨道,是一份十分强大且独特的能力。

然而动画播放器(AnimationPlayer)依旧有着不足,通过其混合这些动画的支持相对有限,只能设置固定的交叉渐变过渡时间。

动画树(AnimationTree)是IdeaXR所引入的一种全新节点,它可以用于处理更多更高级的变换,能够弥补动画播放器(AnimationPlayer)的诸多不足,有着大量的功能和灵活性。

创建一个动画树(AnimationTree)

我们可以通过新建Node的方式新建一个动画树 创建动画树

首先, 必须明确动画树(AnimationTree)节点不包含它自己的动画. 相反, 它使用包含在动画树(AnimationTree)节点中的动画. 通过这种形式, 您可以像往常一样编辑动画(或从3D场景导入动画), 然后使用这个额外节点来控制播放.

在3D场景中经常使用动画树(AnimationTree) . 当从3D交换格式导入场景时, 它们通常自带动画(要么是多个, 要么是在导入时从一个大的动画中拆分出来). 最后, 导入的IdeaXR场景在动画树(AnimationTree) 节点中包含动画.

在IdeaXR中我们很少直接使用导入的场景(它们要么来自实例化, 要么来自继承), 您可以将动画树(AnimationTree) 节点放置在包含导入的新场景中. 然后, 将动画树(AnimationTree)节点指向导入场景内创建的动画树(AnimationTree) 节点.

这是在多人协同合作项目中的设置,参考下图: 多人协同合作项目

我们可以在动画树(AnimationTree) 中使用三种主要节点类型:

  1. 动画节点, 从链接的动画树(AnimationTree) 中引用动画.
  2. 动画根节点, 用于融合子节点.
  3. 动画融合节点,在 AnimationNodeBlendTree 中使用,通过多个输入端口进行单图混合。

动画融合的不同类型

在动画树(AnimationTree) 中设置根节点, 如下几种类型可供选择:

动画树根节点

  • AnimationNodeAnimation:从列表中选择一个动画并播放它. 这是最简单的根节点, 一般不直接用作根节点.
  • AnimationNodeBlendTree:包含许多融合类型的节点,如调配, 融合2, 融合3, 一对一等. 这是最常用的根节点之一.
  • AnimationNodeStateMachine:将多个根节点作为图中的子节点. 每个节点作为一个状态使用, 并提供多个函数在状态之间进行切换.
  • AnimationNodeBlendSpace2D:允许在二维混合空间中放置根节点. 在二维中控制融合位置以融合多个动画.
  • AnimationNodeBlendSpace1D:以上的简化版本(一维)。
  • AnimationRootNode:动画的根节点,通常用于融合子节点。

简单融合

AnimationNodeAnimation

我们可以使用 AnimationNodeAnimation来对单一动画进行指定与控制

指定单个动画

这是最简单的一种动画树根节点,因为其功能较少,我们一般很少直接将其作为根节点。

AnimationRootNode

AnimationRootNode主要用来作为动画的根节点,通常的作用是用来融合子节点,相当于决定了之后的选项锁定什么位置,可以用来明确指定对应骨骼。

AnimationNodeBlendSpace2D

AnimationNodeBlendSpace2D 是一个在二维空间进行高级融合的节点. 将点添加到一个二维空间, 然后可以控制位置来确定融合:

二维融合空间

可以创建多个点,对每个点设置动画:

添加动画

可以控制X和Y的范围(为方便起见, 还可以标记它们). 默认情况下, 可以在任何位置放置点(只需右键单击坐标系统或使用 添加点 按钮)将自动生成德洛内三角形.

融合空间

融合空间

当然也可以通过禁用 自动三角形 选项来手动绘制三角形, 虽然基本上没必要这么做

禁用三角形

最后, 可能会更改融合模式. 默认情况下, 融合是通过在最近的三角形内插点来实现的. 当处理二维动画(逐帧)时, 您可能希望切换到 离散 模式. 此外, 如果您想在离散动画之间切换时保持当前播放位置, 请使用 进位 模式. 此模式可在 混 菜单中更改:

AnimationNodeBlendSpace1D

这类似于二维混合空间, 但在一维空间中(所以不需要三角形).

动画状态机节点(AnimationNodeStateMachine)

这个节点是个相对简单的状态机. 根节点可以创建并通过线路连接. 状态通过 转换 连接, 它们是具有特殊性质的连接. 转换是单向的, 但是可以用两种方式连接.

状态机演示

有多种类型的转换:

融合模式

  • 即刻: 将立即切换到下一个状态. 当前状态将结束, 并融合到新状态的开始.
  • 同步: 立即切换到下一个状态, 但会将新状态搜索并放置到旧状态的回放位置.
  • 在终点: 将等待当前状态回放结束, 然后切换到下一个状态的开始动画.

过渡也有一些属性。单击任何过渡,它就会显示在“检查器”面板中:

过渡属性

  • 切换模式 为过渡类型(见上文), 可以在此处创建后修改.
  • 自动前进 当达到此状态时将自动开启转换. 最适合 "末尾" 切换模式.
  • 前进条件 设置此条件后, 将打开自动前进. 这是一个可以用变量名填充的自定义文本字段. 可以从代码中修改变量(稍后将对此进行详细介绍).
  • X消隐时间 是在这个状态和下一个状态之间交替渐变的时间.
  • 优先级 与代码中的 travel() 函数一起使用. 当从一个状态到另一个状态时, 当给这个节点更多的优先权.
  • 禁用 允许禁用此转换(它不会在行程或自动前进期间使用).

动画融合树节点(AnimationNodeBlendTree)

AnimationNodeBlendTree可包含用于融合的根节点和常规节点。节点从菜单添加到图中: 融合树可用节点

所有融合树默认都包含一个 Output(输出)节点,为了让动画播放,必须有个东西与其相连。

测试此功能最简单的方法是直接连接一个 Animation(动画)节点:

简单的单个动画

这会简单地回放动画. 确保动画树(AnimationTree)节点对实际发生的事情是激活的.

融合 blend(blend2/blend3)

这些节点将通过用户指定输入的两个或三个融合值之间进行融合,以此来进行多种动画的组合播放,下面的例子可以让你比较直观的了解到其用途

同时进行走和转身的动作

对于一些更加复杂的融合,推荐使用融合空间

融合也可以使用过滤器, 也就是说, 您可以单独控制通过融合功能的轨道. 这非常有利于动画的重叠

OneShot

此节点用于执行子动画,并在完成后返回,可用于定制淡入淡出时间、以及过滤器.

在激活启用后会立刻执行一次,然后返回。

oneshot演示

查找 seek

这个节点可以用来使寻找命令发生在动画图像的任何子代上。使用这个节点类型可以从动画融合树中的开始或某个位置播放动画

时间缩放 TimeScale

允许缩放任何子节点的动画速度(或将其反转). 设置为0会暂停动画.通过调整其数值,可以是一个动画变为多倍速或几倍慢动作。

TimeScale测试

转换 Transition

非常简单的状态机(当您不想使用 StateMachine节点时)。动画可以连接到输出,并且可以指定过渡时间。

二维融合空间与一维融合空间 BlendSpace2D/BlendSpace1D

AnimationNodeBlendSpace2DAnimationNodeBlendSpace1D用法相同,具体使用方法可以参考之前关于这两个根节点的介绍,我们可以在融合树中将这个两个节点融合到动画当中。

状态机 StateMachine

我们也可以在融合树内使用状态机,具体使用方式可以参考 AnimationNodeStateMachine中的介绍。